package gui.util;

import javax.swing.*;
import java.awt.*;

public class CenterPanel extends JPanel {
    private double rate;//拉伸比例
    private JComponent c;//显示的组件
    private boolean strech;//是否拉伸

    public CenterPanel(double rate, boolean strech) {
        this.setLayout(null);
        //未设置Layout时， java默认为flowLayout布局的，设置为null即为清空布局管理器，之后添加组件，
        // 常常是设置组件左上角坐标相对于容器左上角（0，0）的x,y值来确定组件的位置，
        // 即使更改容器大小也不会改变位置。这种方式常常用于窗体大小固定的容器里。
        this.rate = rate;
        this.strech =strech;

    }
    public CenterPanel(double rate) {
        this(rate, true);
    }
    /*在repaint方法中，就会使用绝对定位的方式把组件放在中间位置。
如果strech是true，就会根据整个容器的大小，设置组件的大小，达到拉伸的效果
如果strech是false, 就使用组件的preferredSize，即非拉伸效果。*/
    public void repaint(){
        if(null != c){
            //面板大小
            Dimension containerSize = this.getSize();
            Dimension componentSize = c.getPreferredSize();
            if (strech)
                c.setSize((int)(containerSize.width*rate),(int)(containerSize.height*rate));
            else
                c.setSize(componentSize);
            //设置位置
            c.setLocation(containerSize.width/2-c.getSize().width/2,containerSize.height/2-c.getSize().height/2);
        }
        super.repaint();

    }

    /*使用show方法显示组件,show方法中的思路是： 先把这个容器中的组件都移出，然后把新的组件加进来，并且调用updateUI进行界面渲染。
updateUI会导致swing去调用repaint()方法。*/
    public void show(JComponent p){
        this.c=p;
        Component[] cs = getComponents();
        for (Component c:cs){
            remove(c);
        }
        add(p);
        this.updateUI();
    }
    public static void main(String[] args) {
        JFrame f = new JFrame();
        f.setSize(200, 200);
        f.setLocationRelativeTo(null);
        CenterPanel cp = new CenterPanel(0.85,true);
        f.setContentPane(cp);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
        JButton b  =new JButton("abc");
        cp.show(b);

    }
}
